package net_1011;

import java.io.IOException;
import java.net.*;
import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description: 回响服务器
 * User: 86187
 * Date: 2022-10-13
 * Time: 13:52
 */
public class UdpEchoClient {
    private DatagramSocket socket = null;
    // 服务器的IP地址
    private final String serverIp;
    // 服务器端口号
    private final int serverPort;

    // 这两个参数 一会会在发送数据的时候用到.
    // 暂时先把这两个数据存起来
    public UdpEchoClient(String serverIp,int serverPort) throws SocketException {
        socket = new DatagramSocket();
        // 假设serverIp是形如127.0.0.1 这种点分十进制的表示方式(后面会说)
        this.serverIp = serverIp;
        this.serverPort = serverPort;
    }

    // 启动客户端
    public void start() throws IOException {
        Scanner scanner = new Scanner(System.in);
        while(true) {
            // 1. 从控制台读取用户输入的内容
            System.out.print("客户端请求-> ");
            String request = scanner.next();
            // 2. 构造一个UDP请求, 发送给服务器               // 将字符串 request 转为 字节数组.
            DatagramPacket requestPacket = new DatagramPacket(request.getBytes(),request.getBytes().length,
                    //点分十进制的IP发送方式.
                    InetAddress.getByName(this.serverIp),this.serverPort);
            socket.send(requestPacket);// 客户端发送请求

            // 3. 从服务器读取 UDP 响应数据,并解析             byte[4096]字节数组用于读取服务器的响应.
            DatagramPacket responsePacket = new DatagramPacket(new byte[4096],4096);
            socket.receive(responsePacket); // 客户端发送请求后 在接收到服务器响应之前 receive 也会发生阻塞~~
                  // responsePacket.getData()是 将responsePacket里的字节数组转为字符串, 方便打印.
            String response = new String(responsePacket.getData(),0,responsePacket.getLength());

            // 4. 将服务器的响应显示在控制台上.
            System.out.print("服务器响应-> ");
            System.out.println(response);
        }
    }

    public static void main(String[] args) throws IOException {
        UdpEchoClient client = new UdpEchoClient("127.0.0.1",9090);
        client.start();
    }
}
